package com.hp.ams.ongoing.netatendimento.view.managedbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionListener;
import javax.faces.event.AjaxBehaviorEvent;

import org.primefaces.event.FileUploadEvent;

import com.hp.ams.ongoing.netatendimento.application.constants.ApplicationConstantsEnum;
import com.hp.ams.ongoing.netatendimento.application.contract.IServiceProcessAnalysis;
import com.hp.ams.ongoing.netatendimento.application.impl.ContextServiceProcess;
import com.hp.ams.ongoing.netatendimento.application.impl.ServiceBasicData;
import com.hp.ams.ongoing.netatendimento.infrastructure.exception.DataBaseAcessException;
import com.hp.ams.ongoing.netatendimento.infrastructure.util.StringUtil;
import com.hp.ams.ongoing.netatendimento.model.entity.Categorizacao;
import com.hp.ams.ongoing.netatendimento.model.entity.Cidade;
import com.hp.ams.ongoing.netatendimento.model.entity.GrupoExecucao;
import com.hp.ams.ongoing.netatendimento.model.entity.GrupoExecucaoCategorizacao;
import com.hp.ams.ongoing.netatendimento.model.entity.ScriptExecucao;
import com.hp.ams.ongoing.netatendimento.model.entity.TipoRegistro;
import com.hp.ams.ongoing.netatendimento.model.valueobject.IncidentVO;
import com.hp.ams.ongoing.netatendimento.model.valueobject.ResultAnalysisVO;
import com.hp.ams.ongoing.netatendimento.model.valueobject.ResultOperationVO;
import com.hp.ams.ongoing.netatendimento.test.MockNetAnalyser;

@ManagedBean(name="cadastroScriptMB")
@SessionScoped
public class CadastroScriptMB implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -49818908560059857L;
 
	private String numChamado;
	
	private String vlrRegistro;
	
	private TipoRegistro tipoRegistro;
	
	private String categorizacaoSelecionada;
	
	private String grupoExecucaoSelecionado;

	
    public String getGrupoExecucaoSelecionado() {
		return grupoExecucaoSelecionado;
	}


	public void setGrupoExecucaoSelecionado(String grupoExecucaoSelecionado) {
		this.grupoExecucaoSelecionado = grupoExecucaoSelecionado;
	}

	private Map<String,String> lstTipoRegistro = new HashMap<String, String>();  
    
    private List<Cidade> lstOperadoras;
    
    private List<Categorizacao> lstCategorizacoes;
    
    private List<GrupoExecucao> lstGruposExecucao;

    
    private ScriptExecucao scriptSelecionado;

    private String descricaoCategoria;
    
    private String descricaoGrupoExecucao;

    
	public String getDescricaoGrupoExecucao() {
		return descricaoGrupoExecucao;
	}


	public void setDescricaoGrupoExecucao(String descricaoGrupoExecucao) {
		this.descricaoGrupoExecucao = descricaoGrupoExecucao;
	}


	public String getDescricaoCategoria() {
		return descricaoCategoria;
	}


	public void setDescricaoCategoria(String descricaoCategoria) {
		this.descricaoCategoria = descricaoCategoria;
	}


	public ScriptExecucao getScriptSelecionado() {
		return scriptSelecionado;
	}


	public void setScriptSelecionado(ScriptExecucao scriptSelecionado) {
		this.scriptSelecionado = scriptSelecionado;
	}


	public List<GrupoExecucao> getLstGruposExecucao() {
		return lstGruposExecucao;
	}


	public void setLstGruposExecucao(List<GrupoExecucao> lstGruposExecucao) {
		this.lstGruposExecucao = lstGruposExecucao;
	}


	public List<ScriptExecucao> getLstScriptsExecucao() {
		return lstScriptsExecucao;
	}


	public void setLstScriptsExecucao(List<ScriptExecucao> lstScriptsExecucao) {
		this.lstScriptsExecucao = lstScriptsExecucao;
	}

	private List<ScriptExecucao> lstScriptsExecucao;

    private List<IncidentVO> lstIncidents = new ArrayList<IncidentVO>();
    
    private List<ResultAnalysisVO> lstResultAnalysis = new ArrayList<ResultAnalysisVO>();
    
    public CadastroScriptMB() {    	
    	
	}


	public String getNumChamado() {
		return numChamado;
	}


	public void setNumChamado(String numChamado) {
		this.numChamado = numChamado;
	}


	public String getVlrRegistro() {
		return vlrRegistro;
	}


	public void setVlrRegistro(String vlrRegistro) {
		this.vlrRegistro = vlrRegistro;
	}


	public TipoRegistro getTipoRegistro() {
		return tipoRegistro;
	}


	public void setTipoRegistro(TipoRegistro tipoRegistro) {
		this.tipoRegistro = tipoRegistro;
	}


	public Map<String, String> getLstTipoRegistro() {
		return lstTipoRegistro;
	}


	public void setLstTipoRegistro(Map<String, String> lstTipoRegistro) {
		this.lstTipoRegistro = lstTipoRegistro;
	}


	public List<Cidade> getLstOperadoras() {
		if (lstOperadoras == null)
			try {
				lstOperadoras = ServiceBasicData.getInstance().getAllCidades();
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return lstOperadoras;
	}


	public void setLstOperadoras(List<Cidade> lstOperadoras) {
		this.lstOperadoras = lstOperadoras;
	}


	public List<IncidentVO> getLstIncidents() {
		return lstIncidents;
	}


	public void setLstIncidents(List<IncidentVO> lstIncidents) {
		this.lstIncidents = lstIncidents;
	}


	public List<ResultAnalysisVO> getLstResultAnalysis() {
		return lstResultAnalysis;
	}


	public void setLstResultAnalysis(List<ResultAnalysisVO> lstResultAnalysis) {
		this.lstResultAnalysis = lstResultAnalysis;
	}

	public List<Categorizacao> getLstCategorizacoes() {		
			try {
				lstCategorizacoes = ServiceBasicData.getInstance().getAllByEntity(Categorizacao.class);
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return lstCategorizacoes;
	}


	public void setLstCategorizacoes(List<Categorizacao> lstCategorizacoes) {
		this.lstCategorizacoes = lstCategorizacoes;
	}


	public String getCategorizacaoSelecionada() {
		return categorizacaoSelecionada;
	}


	public void setCategorizacaoSelecionada(String categorizacaoSelecionada) {
		this.categorizacaoSelecionada = categorizacaoSelecionada;
	}


	private void cleanFields(){
		setCategorizacaoSelecionada(null);
		setNumChamado(null);
		setTipoRegistro(null);
		setVlrRegistro(null);
		//setCidadeSelecionada(null);
	}

	public void populateIncidentsList(ActionListener listener){		
		IncidentVO vo = new IncidentVO();
		vo.setNumChamado(this.numChamado);
		vo.setTipoRegistro(this.tipoRegistro);
		vo.setVlrRegistro(this.vlrRegistro);
		//vo.setCidade(this.cidadeSelecionada);
		getLstIncidents().add(vo);
		cleanFields();
	}
	
	public void salvar(ActionListener listener){
		ResultOperationVO resultOper = null;
		FacesMessage msg = null; 
		List toSave = new ArrayList();
		if(descricaoCategoria !=null && !descricaoCategoria.equals(""))  {
			toSave.add(descricaoCategoria);
			try {
				resultOper = ServiceBasicData.getInstance().save(Categorizacao.class,toSave.toArray());
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else if(descricaoGrupoExecucao !=null && !descricaoGrupoExecucao.equals(""))  {
			String[] arr = categorizacaoSelecionada.split("\\-");
			toSave.add(descricaoGrupoExecucao);
			toSave.add(null);
			try {
				resultOper = ServiceBasicData.getInstance().save(GrupoExecucao.class,toSave.toArray());
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			toSave.clear();
			Categorizacao cat = new Categorizacao(new Integer(arr[0]), arr[1]);
			
			toSave.add(cat.getIdCategoria());
			toSave.add(resultOper.getLastCommitedKey());
			try {
				resultOper = ServiceBasicData.getInstance().save(GrupoExecucaoCategorizacao.class,toSave.toArray());
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (resultOper.isSucceed()){
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "SALVO COM SUCESSO", "aa");    
		}
		FacesContext.getCurrentInstance().addMessage(null, msg); 
		cleanFields();
	}
	
	 public void handleCategoriaChange(AjaxBehaviorEvent event) {
		 List lst = new ArrayList<GrupoExecucao>();
		 Categorizacao cat = new Categorizacao();
	        if(categorizacaoSelecionada !=null && !categorizacaoSelecionada.equals(""))  {	      	        	
	        	String[] arr = categorizacaoSelecionada.split("\\-");
				cat = new Categorizacao(new Integer(arr[0]), arr[1]);
	        	try {
					lst = ServiceBasicData.getInstance().findGruposByCategorizacao(GrupoExecucao.class, cat);
				} catch (DataBaseAcessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        }
	        setLstGruposExecucao (lst);	          
	    }  
	 
	 public void handleGrupoExecucaoChange(AjaxBehaviorEvent event){
		 List lst = new ArrayList<GrupoExecucao>();
		 GrupoExecucao gr = new GrupoExecucao();
	        if(grupoExecucaoSelecionado !=null && !grupoExecucaoSelecionado.equals(""))  {	      	        	
	        	String[] arr = categorizacaoSelecionada.split("\\-");
				gr = new GrupoExecucao(new Integer(arr[0]), arr[1],null);
	        	try {
					lst = ServiceBasicData.getInstance().findScriptsByGrupo(GrupoExecucao.class, gr);
				} catch (DataBaseAcessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        }
	        setLstScriptsExecucao(lst);		 
	 }
	
	 public List<Categorizacao> completeCategorizacoes(String query) {  
	        List<Categorizacao> suggestions =  new ArrayList<Categorizacao>();  
	        for(Categorizacao p : getLstCategorizacoes()) {  
	            if(StringUtil.matchExpr(p.toString().trim(), query.toUpperCase()))  {
	                suggestions.add(p);  
	            }
	        }  	          
	        return suggestions;  
	    }  
	 
	 public List<TipoRegistro> completeTiposRegistro(String query) {  
	        List<TipoRegistro> suggestions =  new ArrayList<TipoRegistro>();  
//	        for(TipoRegistro p : getLstTiposRegistro()) {  
//	            if(StringUtil.matchExpr(p.toString().trim(), query.toUpperCase()))  {
//	                suggestions.add(p);  
//	            }
//	        }  	          
	        return suggestions;  
	    }  
	 
	 public void handleFileUpload(FileUploadEvent event) {
		   FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");  
	        FacesContext.getCurrentInstance().addMessage(null, msg); 
	      System.out.println(event.getFile().getFileName());  
	    } 

    
}
